package com.aco.fatureapp.activity;

import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import roboguice.inject.ContentView;
import roboguice.inject.InjectView;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnLongClickListener;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.aco.fatureapp.R;
import com.aco.fatureapp.model.Fotografia;
import com.aco.fatureapp.model.Imovel;
import com.aco.fatureapp.model.Roteiro;
import com.aco.fatureapp.utilitary.BitmapUtil;
import com.aco.fatureapp.utilitary.FileUtils;
import com.aco.fatureapp.utilitary.JSonHttpRequest;
import com.aco.fatureapp.utilitary.Utils;

@ContentView(R.layout.activity_photo_galery)
public class PhotoGaleryActivity extends BaseActivity {

	private List<Fotografia> mLstFotografia = new ArrayList<Fotografia>();

	private final String IMG_PATH = FileUtils.getStorageDirectory()
			.getAbsolutePath()
			+ "/"
			+ FileUtils.DIRETORIO_PADRAO
			+ FileUtils.DIRETORIO_IMAGENS;

	/*
	 * Images
	 */
	@InjectView(R.id.FT1)
	private TextView mFoto1;

	@InjectView(R.id.FT2)
	private TextView mFoto2;

	@InjectView(R.id.FT3)
	private TextView mFoto3;

	@InjectView(R.id.FT4)
	private TextView mFoto4;

	private Menu mOptionMenu;

	private Roteiro mRoteiro;

	private Imovel mImovel;

	private String mArquivo;

	/*
	 * Variável de controle que representa sempre a posição que está vazia.
	 */
	private int mPosicao = 1;

	/*
	 * (non-Javadoc)
	 *
	 * @see android.app.Activity#onCreate(android.os.Bundle)
	 */
	@Override
	public void onCreate(final Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		Iterator<Roteiro> lstRoteiro = Roteiro.findAll(Roteiro.class);

		if (lstRoteiro != null && lstRoteiro.hasNext()) {
			mRoteiro = lstRoteiro.next();
		}

		mImovel = (Imovel) getIntent().getExtras().getSerializable(
				Imovel.getTableName(Imovel.class));

		registrarEventoLongClick(mFoto1);
		registrarEventoLongClick(mFoto2);
		registrarEventoLongClick(mFoto3);
		registrarEventoLongClick(mFoto4);
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
	 */
	@Override
	public boolean onCreateOptionsMenu(final android.view.Menu menu) {
		super.onCreateOptionsMenu(menu);

		final MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.action_bar_menu_photo_galery, menu);

		getActionBar().setDisplayHomeAsUpEnabled(true);

		this.mOptionMenu = menu;

		exibirImagens();

		return true;
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see android.app.Activity#onMenuItemSelected(int, android.view.MenuItem)
	 */
	@Override
	public boolean onMenuItemSelected(final int featureId, final MenuItem item) {
		switch (item.getItemId()) {
		case android.R.id.home: {
			finish();
			return true;
		}
		case R.id.menu_camera: {
			TextView imgView = (TextView) findViewById(getResources()
					.getIdentifier(String.valueOf("FT" + mPosicao), "id",
							this.getPackageName()));

			startAppCamera(imgView);
			return true;
		}
		case R.id.menu_sair: {
			finish();
			return true;
		}
		}
		return true;
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see roboguice.activity.RoboActivity#onActivityResult(int, int,
	 * android.content.Intent)
	 */
	@Override
	protected void onActivityResult(final int requestCode,
			final int resultCode, final Intent data) {
		super.onActivityResult(requestCode, resultCode, data);

		if (resultCode == RESULT_OK) {
			try {
				BitmapUtil.compress(IMG_PATH + "/" + mArquivo);

				long count = Fotografia.count(Fotografia.class,
						"nome_arquivo=?", new String[] { mArquivo.toString() });

				if (count == 0) {
					Fotografia newFoto = new Fotografia(
							mRoteiro.getIdIntegracao(),
							mRoteiro.getCompetencia(), mImovel.getInscricao(),
							mArquivo);

					newFoto.save();
				}

				exibirImagens();
			}
			catch (final Exception e) {
				Utils.alert(this, JSonHttpRequest.ERRO_GENERICO, null);
			}

		}
	}

	/**
	 *
	 * @param imgView
	 */
	private void registrarEventoLongClick(final TextView imgView) {
		imgView.setOnLongClickListener(new OnLongClickListener() {
			@Override
			public boolean onLongClick(final View v) {
				Utils.alert(PhotoGaleryActivity.this,
						"Escolha uma das operações abaixo:", "Atualizar",
						"Excluir",

						new Dialog.OnClickListener() {

							@Override
							public void onClick(DialogInterface dialog,
									int which) {
								startAppCamera(imgView);
							}
						},

						new Dialog.OnClickListener() {

							@Override
							public void onClick(DialogInterface dialog,
									int which) {
								try {
									excluirFoto(imgView);
								}
								catch (Exception e) {
									Utils.alert(PhotoGaleryActivity.this,
											JSonHttpRequest.ERRO_GENERICO, null);
								}
							}
						}, false);

				return true;
			}
		});
	}

	/**
	 * Excluir imagem e referência da base de dados.
	 *
	 * @param imgView
	 */
	private void excluirFoto(final TextView imgView) {

		String nomeArquivo = imgView.getTag().toString();

		Fotografia.deleteAll(Fotografia.class, "nome_arquivo = ?", nomeArquivo);

		File file = new File(IMG_PATH + "/" + nomeArquivo);

		if (file.exists()) {
			file.delete();
		}

		/**
		 * Esconde o último espaço preenchido.
		 */
		TextView excluido = (TextView) findViewById(getResources()
				.getIdentifier(String.valueOf("FT" + (mPosicao - 1)), "id",
						this.getPackageName()));

		excluido.setTag(null);
		excluido.setVisibility(View.GONE);

		exibirImagens();
	}

	/**
	 * Exibir imagens de acordo com as referências da base de dados.
	 */
	private void exibirImagens() {
		mLstFotografia = Fotografia.find(Fotografia.class, "inscricao = ?",
				mImovel.getInscricao().toString());

		mPosicao = 1;
		if (mLstFotografia != null && !mLstFotografia.isEmpty()) {

			for (int i = 0; i < mLstFotografia.size(); i++) {

				if (mPosicao > 4) {
					continue;
				}

				String nomeArquivo = mLstFotografia.get(i).getNomeArquivo();

				Bitmap bitmap = BitmapUtil.loadBitmap(IMG_PATH + "/"
						+ nomeArquivo);

				if (bitmap != null) {

					TextView photo = (TextView) findViewById(getResources()
							.getIdentifier(String.valueOf("FT" + mPosicao),
									"id", this.getPackageName()));

					photo.setTag(nomeArquivo);
					photo.setVisibility(View.VISIBLE);

					Bitmap bitmapScaled = BitmapUtil.scaleBitmap(bitmap,
							getScalingFactor(bitmap, photo));

					photo.setCompoundDrawablesWithIntrinsicBounds(null, null,
							null, new BitmapDrawable(this.getResources(),
									bitmapScaled));

					mPosicao++;
				}
			}

		}

		gerenciarMenuItem();
	}

	/**
	 *
	 * Inicia a câmera do dispositivo
	 *
	 * @param imgView
	 */
	private void startAppCamera(final TextView imgView) {

		this.mArquivo = imgView.getTag() != null ? imgView.getTag().toString()
				: getNomeArquivo(imgView);

		final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

		intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION,
				ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

		intent.putExtra(MediaStore.EXTRA_OUTPUT,
				Uri.fromFile(new File(IMG_PATH, mArquivo)));

		startActivityForResult(intent, 0);
	}

	/**
	 * Calcula o fator de escala de acordo com as métricas do display.
	 *
	 * @param bm
	 * @param photo
	 * @return
	 */
	private float getScalingFactor(Bitmap bm, TextView photo) {

		Point size = new Point();

		getWindowManager().getDefaultDisplay().getSize(size);

		FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) ((LinearLayout) photo
				.getParent()).getLayoutParams();

		int leftMargin = layoutParams.leftMargin;
		int rightMargin = layoutParams.rightMargin;

		int imageViewWidth = size.x - (leftMargin + rightMargin);

		return ((float) imageViewWidth / (float) bm.getWidth());
	}

	/**
	 * Realiza algumas interações com o usuário através dos itens do menu na
	 * action bar.
	 */
	private void gerenciarMenuItem() {

		if (mOptionMenu != null) {

			/**
			 * Após a 1ª foto a opção sair muda para confirmar.
			 */
			if (mPosicao > 1) {
				mOptionMenu.getItem(1).setIcon(R.drawable.ic_action_done);
				mOptionMenu.getItem(1).setTitle("Confirmar");
			}
			else {
				mOptionMenu.getItem(1).setIcon(R.drawable.ic_action_cancel);
				mOptionMenu.getItem(1).setTitle("Sair");
			}

			/**
			 * Após a 4ª foto a opção da câmera fica indisponível.
			 */
			if (mPosicao > 4) {
				mOptionMenu.getItem(0).setVisible(Boolean.FALSE);
			}
			else {
				mOptionMenu.getItem(0).setVisible(Boolean.TRUE);
			}
		}
	}

	/**
	 * @param imgView
	 * @return
	 */
	private String getNomeArquivo(final TextView imgView) {
		return mImovel.getInscricao() + "_" + mRoteiro.getIdIntegracao() + "_"
				+ mRoteiro.getCompetencia() + "_" + new Date().getTime()
				+ ".jpg";
	}
}